package servlet;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

import tournoi.modele.*;
import tournoi.stateless.TournoiFacade;

/**
 * Servlet permettant la gestion la partie publique du site. Cette servlet va
 * permettre de rediriger la client du site vers la bonne jsp, tout en envoyant
 * les informations nécessaires à l'affichage de celle ci. La servlet fait aussi
 * la relation entre la facade de nos objets et les jsp.
 * 
 * @author Florent Champigny, Kevin De Jesus Ferreira and Julien Mialon
 * 
 */
@WebServlet("/index")
public class TournoiServlet extends HttpServlet {

	private static final long serialVersionUID = -5041742716961413518L;
	/**
	 * Session du site
	 */
	HttpSession session;
	/**
	 * Facade stateless
	 */
	TournoiFacade tournoi;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public TournoiServlet() {
		super();
	}

	/**
	 * Méthode permettant de lancer la page d'accueil du site.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerAccueil(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/accueil.jsp").forward(request, response);
	}

	/**
	 * Méthode permettant de lancer la page d'inscription du site.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerInscription(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/inscription.jsp").forward(request,
				response);
	}

	/**
	 * Méthode permettant d'afficher le tournoi. On envoi en paramètre de la
	 * session le tournoi récupéré à l'aide de la facade
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerTournoi(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Tournoi le_tournoi = tournoi.getTournoi();
		session.setAttribute("le_tournoi", le_tournoi);
		request.getRequestDispatcher("/tournoi.jsp").forward(request, response);
	}

	/**
	 * Méthode permettant de lancer la jsp affichant la liste de toutes les
	 * équipes avec leur composition
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerEquipes(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		List<Equipe> equipes = (List<Equipe>) tournoi.getAllEquipes();
		session.setAttribute("equipes", equipes);
		request.getRequestDispatcher("/equipes.jsp").forward(request, response);
	}

	/**
	 * Méthode permettant d'afficher le détail d'un match. Pour cela on récupère
	 * la jsp avec la facade et on l'ajoute dans la session
	 * 
	 * @param id_match
	 *            - Id du match dont on veut afficher le détail
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerMatch(int id_match, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Match match = tournoi.getMatchById(id_match);
		if (match != null) {
			session.setAttribute("match", match);
			request.getRequestDispatcher("/match.jsp").forward(request,
					response);
		} else
			lancerAccueil(request, response);
	}

	/**
	 * Méthode permettant d'afficher le détail d'une équipe. On récupère
	 * l'équipe grâce à son id et à la facade. On la stocke ensuite en session
	 * 
	 * @param id_equipe
	 *            - Id de l'équipe dont on veut afficher le détail
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerEquipe(int id_equipe, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Equipe equipe = tournoi.getEquipeById(id_equipe);
		if (equipe != null) {
			session.setAttribute("equipe", equipe);
			request.getRequestDispatcher("/equipe.jsp").forward(request,
					response);
		} else
			lancerAccueil(request, response);
	}

	/**
	 * Méthode permettant d'afficher la liste des matchs. Les matchs seront
	 * triés par leur état ( prévu,en cours , finit).
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	private void lancerMatchs(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		List<Match> matchs_prevus = tournoi.getMatchByEtat(Match.PREVU);
		List<Match> matchs_en_cours = tournoi.getMatchByEtat(Match.EN_COURS);
		List<Match> matchs_finits = tournoi.getMatchByEtat(Match.FINIT);
		session.setAttribute("matchs_prevus", matchs_prevus);
		session.setAttribute("matchs_en_cours", matchs_en_cours);
		session.setAttribute("matchs_finits", matchs_finits);

		request.getRequestDispatcher("/matchs.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * 
	 * Méthode nous permettant de rediriger le client vers la bonne jsp en
	 * fonction d'une "requête". Pour cela on regarde l'action stocker dans la
	 * session et en fonction de celle çi on effectue diverse opération pour
	 * envoyer le client vers la vue souhaitée et avec les informations
	 * nécessaires.
	 * 
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String action = request.getParameter("action");

		session = request.getSession(true);
		tournoi = (TournoiFacade) session.getAttribute("tournoi");
		if (tournoi == null) {
			Context ctx;
			try {
				ctx = new InitialContext();
				tournoi = (TournoiFacade) ctx
						.lookup("java:global/TournoiWeb/TournoiFacade!tournoi.stateless.TournoiFacadeLocal");
			} catch (NamingException e) {
				e.printStackTrace();
			}
			session.setAttribute("tournoi", tournoi);
		}

		if (action == null) {
			lancerAccueil(request, response);
		} else if (action.equals("inscription")) {
			String nom = request.getParameter("nom");

			if (nom == null || nom.length() == 0)
				lancerInscription(request, response);
			else {
				Set<Joueur> joueurs = new HashSet<Joueur>();

				String[] nomJoueur = request.getParameterValues("nom_joueur");
				String[] prenomJoueur = request
						.getParameterValues("prenom_joueur");

				if (nomJoueur != null && prenomJoueur != null
						&& nomJoueur.length <= 15) {
					for (int i = 0; i < nomJoueur.length; ++i) {
						Joueur joueur = new Joueur();
						joueur.setPrenom(prenomJoueur[i]);
						joueur.setNom(nomJoueur[i]);
						joueurs.add(joueur);
					}
					tournoi.addEquipe(nom, joueurs);
					lancerEquipes(request, response);

				} else
					lancerInscription(request, response);
			}
		} else if (action.equals("login")) {
			String username = request.getParameter("username");
			String password = request.getParameter("password");

			if (username.equals("admin") && password.equals("admin")) {
				request.getRequestDispatcher("/admin.jsp").forward(request,
						response);
			} else {
				PrintWriter pr = new PrintWriter(new OutputStreamWriter(
						response.getOutputStream()));
				pr.println("username :" + username);
				pr.println("password :" + password);
				pr.flush();
			}
		} else if (action.equals("equipes")) {
			lancerEquipes(request, response);
		} else if (action.equals("equipe")) {
			String id = request.getParameter("id");
			if (id != null && !id.equals("")) {
				int equipe_id = Integer.parseInt(id);
				lancerEquipe(equipe_id, request, response);
			}
		} else if (action.equals("tournoi")) {
			lancerTournoi(request, response);
		} else if (action.equals("match")) {
			String id = request.getParameter("id");
			if (id != null && !id.equals("")) {
				int match_id = Integer.parseInt(id);
				lancerMatch(match_id, request, response);
			}
		} else if (action.equals("matchs")) {
			lancerMatchs(request, response);
		}
	}

}